package server;

import java.util.HashMap;

import chat.ChatServer;
import file.FileServer;

public class IntermediateServer {

	private Server server;
	
	private final int ROOM_TYPE_IS_CHAT = 1;
	private final int ROOM_TYPE_IS_FILE = 2;
	
	// 최대 추가 가능한 방의 개수
	private final int MAX_ROOM_NUMBER = 3;
	
	// 0번이 기본 
	private int now_type = 0;
	
	// 키 값으로 서버 소캣번호, 벨류로 서버를 가짐
	HashMap manage_port;
	
	public IntermediateServer(int room_type, Server server) {
		
		switch(room_type){
		case ROOM_TYPE_IS_CHAT:
			this.now_type = ROOM_TYPE_IS_CHAT;
			this.manage_port = new HashMap<Integer, ChatServer>();
			this.server = server;
			break;
		case ROOM_TYPE_IS_FILE:
			this.now_type = ROOM_TYPE_IS_FILE;
			this.manage_port = new HashMap<Integer, FileServer>();
			this.server = server;
			break;
		default:
			break;
		}
	}
	
	public boolean manage_port_size(){
		if(manage_port.size() == MAX_ROOM_NUMBER){
			return false;
		}
		else{
			return true;
		}
	}
	private boolean add_chat_management(int port_number){
		if(MAX_ROOM_NUMBER >= manage_port.size()){
			System.out.println("새로운 채팅 서버를 생성합니다 채팅서버의 포트번호 : "+ port_number);
			ChatServer chatServer = new ChatServer(port_number, this);
			System.out.println("포트를 저장합니다");
			manage_port.put(port_number, chatServer);
			System.out.println("서버의 할당 가능 포트번호(현재 : " +server.getPort_number() +")를 1 증가시킵니다.");
			server.setPort_number();
			System.out.println("증가된 포트번호 : " + server.getPort_number());
			return true;
		}
		return false;
	}
	
	private boolean add_file_management(int port_number){
		if(MAX_ROOM_NUMBER >= manage_port.size()){
			System.out.println("새로운 파일 서버를 생성합니다 채팅서버의 포트번호 : "+ port_number);
			FileServer fileServer = new FileServer(port_number);
			System.out.println("포트를 저장합니다");
			manage_port.put(port_number, fileServer);
			System.out.println("서버의 할당 가능 포트번호(현재 : " +server.getPort_number() +")를 1 증가시킵니다.");
			server.setPort_number();
			System.out.println("증가된 포트번호 : " + server.getPort_number());
			return true;
		}
		return false;
	}

	public boolean add_manage_port(int port_number){	// 첫번째 값은 포트번호
		boolean return_type = true;	// 생성되면 0이 반환 (정상)
		try {
			if(now_type == ROOM_TYPE_IS_CHAT){
				if(!add_chat_management(port_number)){
					System.out.println("정상적으로 채팅 서버 생성이 이루어지지 않았습니다.");
					System.out.println("오류 : 최대 생성 크기만큼 서버가 만들어져있습니다.");
					return_type = false;
				}
			}
			else if(now_type == ROOM_TYPE_IS_FILE){
				if(!add_file_management(port_number)){
					System.out.println("정상적으로 채팅 서버 생성이 이루어지지 않았습니다.");
					System.out.println("오류 : 최대 생성 크기만큼 서버가 만들어져있습니다.");
					return_type = false;
				}
			}
			else{
				throw new Exception();
			}
		} catch (Exception e) {
			System.out.println("Casting Exception !!!!! ");
			e.getStackTrace();
		}
		return return_type;
	}

	public HashMap getManage_port() {
		return manage_port;
	}

	public void setManage_port(HashMap manage_port) {
		this.manage_port = manage_port;
	}

	public int getMAX_ROOM_NUMBER() {
		return MAX_ROOM_NUMBER;
	}

	public int getNow_type() {
		return now_type;
	}

	public void setNow_type(int now_type) {
		this.now_type = now_type;
	}

	public Server getServer() {
		return server;
	}

	public void setServer(Server server) {
		this.server = server;
	}
}
